#include <avr/io.h>
#include <avr/iom644.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>

#include "usart_utils.h"

void USART_Init(unsigned int baudrate)
{
	/* Se configura la veloridad de transferencia. */
	/* Ver tabla de valores. */

	UBRR0H = (unsigned char)(baudrate>>8);
	UBRR0L = (unsigned char)baudrate;

	/* Se habilita la transmision y la recepcion. */

	UCSR0B = (1<<RXEN0)|(1<<TXEN0);

	/* Formato: 8data, 2stop bit. */

	UCSR0C = (1<<USBS0)|(3<<UCSZ00);

	/* Se habilitan las interrupciones. */

	sei();
}

void USART_Transmit(unsigned char data)
{
	/* Se espera a que el buffer este vacio. */

	while (!( UCSR0A & (1<<UDRE0))) {
		;
	}

	/* Se pone el caracter en buffer. */

	UDR0 = data;
}

unsigned char USART_Receive(void)
{
	/* Se espera a que se reciba un dato. */

	while (!(UCSR0A & (1<<RXC0))) {
		;
	}

	/* Se lee el dato de buffer. */

	return UDR0;
}

void USART_Send_String(char *buffer)
{
	unsigned char aux = 0;

	/* Se mandan todos los caracteres que se reciben. */

	do
	{
		/* Se manda cada caracter. */
		aux = *buffer;
		buffer ++;
		USART_Transmit(aux);
	}
	while (aux != 0);
}

void USART_Recive_String(char *buffer)
{
	unsigned char aux = 0;

	/* Se reciben caracteres hasta encontrar un 0. */

	do
	{
		/* Se lee cada caracter. */
		aux = USART_Receive();
		*buffer = aux;
		buffer++;
	}
	while (aux != 0);

	return;
}
